#include "linklist.h"

// 1.创建空的链表
linknode_t *create_empty_linklist()
{
		linknode_t *head = NULL;

		head = (linknode_t *)malloc(sizeof(linknode_t));

		if (NULL == head)
		{
				printf("malloc failed!\n");
				return NULL;
		}

		memset(head, 0, sizeof(linknode_t));

		return head;
}

// 尾插法
void insert_tail_linklist(linknode_t *head, datatype_t data)
{
		// 2.1为节点在堆区申请空间
		linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
		if (NULL == temp)
		{
				printf("malloc failed!\n");
		}
		// 2.2插入数据
		temp->data = data;
		// 找到尾节点
		linknode_t *p = head;
		while(p->next != NULL)
		{
				p = p->next;
		}

		temp->next = p->next;
		p->next = temp;

		return;
}

int is_empty_linklist(linknode_t *head)
{
	return head->next == NULL ? 1 : 0;
}

int delete_data_linklist(linknode_t *head, int id)
{
	linknode_t *p = NULL;
	linknode_t *q = NULL;
	
	int flag = 0;

	if (is_empty_linklist(head))
	{
		return -1;
	}

	p = head;

	// 没有遍历到链表尾部
	while (p->next != NULL)
	{
		if (p->next->data.id == id)
		{
			// 保存要删除节点的地址
			q = p->next;
			p->next = q->next;
			free(q);

			q = NULL;

			flag = 1;

		}
		else
		{
			p = p->next;
		}		
	}

	if (flag == 0)
	{
		return -2;
	}
	else
	{
		return 0;
	}
}

// 删除链表中所有的节点
void clean_up_linklist(linknode_t *head)
{
	linknode_t *p = head;
	linknode_t *q = NULL;

	while (p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
	return;
}
